// 要将一个 float* 指针赋值给 Eigen 的 Tensor，您需要使用 Map 来映射指针到 Tensor 对象中。以下是一个示例，演示了如何将 float* 指针中的数据赋值给一个形状为 [2, 2, 3] 的 Tensor：
#include <Eigen/Dense>
#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>

//列优先
// int main() {
//     // 假设有一个 float 数组包含了相应的数据
//     float data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f};

//     // 创建指向该数组的 float* 指针
//     float* ptr = data;

//     // 创建一个 2x2x3 的 Tensor 并将指针映射到 Tensor
//     Eigen::TensorMap<Eigen::Tensor<float, 3>> tensor(ptr, 2, 2, 3);

//     // 输出 Tensor 的内容
//     std::cout << "Tensor contents from float pointer:\n" << tensor << std::endl;

//     return 0;
// }

//行优先

int main() {
    // 假设有一个 float 数组包含了相应的数据
    float data[] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f};

    // 创建指向该数组的 float* 指针
    float* ptr = data;

    // 创建一个 2x2x3 的 Tensor 并将指针映射到 Tensor（使用行优先存储）
    Eigen::TensorMap<Eigen::Tensor<float, 3, Eigen::RowMajor>> tensor(ptr, 2, 2, 3);

    // 输出 Tensor 的内容
    std::cout << "Tensor contents from float pointer (RowMajor):\n" << tensor << std::endl;

    std::cout << "取[1,1,0] (RowMajor): " << tensor(1, 1, 0) << std::endl;
    std::cout << "tensor shape:" << tensor.dimensions() << std::endl;  //输出矩阵shape

    //切片取值
    // 获取指定索引位置 [1,1] 的所有值
    // 使用 slice 方法获取 [1,1] 位置的所有值
#if 0  //这个列优先才能使用slice
    Eigen::array<Eigen::Index, 3> offsets = {1, 1, 0};
    Eigen::array<Eigen::Index, 3> extents = {1, 1, tensor.dimension(2)};

    Eigen::Tensor<float, 1> extractedValues =
        tensor.slice(offsets, extents)
            .reshape(Eigen::array<Eigen::Index, 1>({tensor.dimension(2)}));

    // 输出结果
    std::cout << "Values at index [1,1] from RowMajor Tensor:\n" << extractedValues << std::endl;
#endif

    int row_index = 1;  // 第一个索引
    int col_index = 1;  // 第二个索引

    // 手动计算偏移量并遍历获取 [1,1] 位置的所有值
    Eigen::Tensor<float, 1> extractedValues(tensor.dimension(2));
    for (int i = 0; i < tensor.dimension(2); ++i) {
        extractedValues(i) = tensor(row_index, col_index, i);
    }

    std::cout << "extractedValues shape:" << extractedValues.dimensions()
              << std::endl;  //输出矩阵shape
    // 输出结果
    std::cout << "Values at index [1,1] from RowMajor Tensor:\n" << extractedValues << std::endl;

    //变化新矩阵排布
    Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>> tensor2(extractedValues.data(), 3,
                                                                       1);
    std::cout << "tensor2 shape:" << tensor2.dimensions() << std::endl;  //输出矩阵shape
    std::cout << tensor2 + 1.0f << std::endl;

    printf("========================\n");
    float data2[] = {1.1f, 2.2f, 3.3f};
    Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>> temp_tensor(data2, 3, 1);
    std::cout << tensor2 * temp_tensor << std::endl;

    return 0;
}
